/**
 * 
 */
package com.proyecto.histoclin.modelo.servicios;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.aiepi.modelo.dto.CorrelativosAiepisId;
import com.proyecto.aiepi.modelo.servicios.ServicioCorrelativosAiepis;
import com.proyecto.aiepi.modelo.servicios.ServicioTablaApoyoAiepisDiagnosticos;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.histoclin.modelo.dto.HistoclinAiepiResultado;

/**
 * @author vico
 *
 */
public class ServicioHistoclinAiepiResultado extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosAiepis servicioCorrelativosAiepis;
	ServicioTablaApoyoAiepisDiagnosticos servicioTablaApoyoAiepisDiagnosticos;
	
	public ServicioHistoclinAiepiResultado() {
		// TODO Auto-generated constructor stub
	}


	
	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub
		//super.incluir(pojo, iniciaTransaccion);
		
		HistoclinAiepiResultado objHistoclinAiepiResultado = (HistoclinAiepiResultado)pojo;

		if (isValidacionActiva()){
			validacion.incluir(objHistoclinAiepiResultado);
		}
		
		
		try {
			
			String proxNumero = servicioCorrelativosAiepis.obtenerProximoNumeroComoString(
					new CorrelativosAiepisId (objHistoclinAiepiResultado.getId().getCiaopr(), "HCAIEPIRESUL","hcaiepiresulcod" ) ,true);

			objHistoclinAiepiResultado.getId().setHcaiepiresulcod( Integer.parseInt(proxNumero) );
		
			super.incluir(objHistoclinAiepiResultado, iniciaTransaccion);
			
			
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioHistoriasClinicas::: " + e.getMessage());
			if("advertencia.HistoriasClinicas.datosBasicos.HistoriasClinicas.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
		}
		
	}

	public void almacenarHistoclinAiepiResultado_conDiagnostico(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		HistoclinAiepiResultado objHistoclinAiepiResultado = (HistoclinAiepiResultado)pojo;
		this.incluir(objHistoclinAiepiResultado, iniciaTransaccion);
		System.out.println("objHistoclinAiepiResultado.getId().getHcaiepiresulcod(): " + objHistoclinAiepiResultado.getId().getHcaiepiresulcod() );
		System.out.println("objHistoclinAiepiResultado.getCampoaiepirespucod(): " + objHistoclinAiepiResultado.getCampoaiepirespucod());
		//cuando incluimos el resultado de aiepi, debemos buscar el aiepi en la tabla de los diagnosticos para aiepi.
		//luego insertarlo en la tabla de los diagnosticos de la historia.
		// VAMOS A PROBAR ESTO DE OTRA FORMA :D
		/*
		if(objHistoclinAiepiResultado.getId().getHcaiepiresulcod() != null){
			Integer aiepidxcod = -1;
			String ciecod = "";
			String diagnosticotipocod = ParametrosIniciales.DIAGNOSTICOTIPOCOD_AIEPI;
			String[] atributo = {"id.ciaopr","campoaiepirespucod"};
			Object[] valor = {objHistoclinAiepiResultado.getId().getCiaopr(),objHistoclinAiepiResultado.getCampoaiepirespucod()};
			List<AiepisDiagnosticos> lstAiepisDiagnosticos = new ArrayList<AiepisDiagnosticos>();
			try {
				lstAiepisDiagnosticos = servicioTablaApoyoAiepisDiagnosticos.buscarCatalogoPorPropiedad(atributo, valor, TipoBusqueda.OPE_IGUAL, false);
				
				if(lstAiepisDiagnosticos.size() > 0 ){
					for(int i = 0 ; i < lstAiepisDiagnosticos.size() ; i++){
						aiepidxcod = lstAiepisDiagnosticos.get(i).getId().getAiepidxcod();
						ciecod = lstAiepisDiagnosticos.get(i).getCiecod();
						System.out.println("aiepidxcod: " + aiepidxcod);
						
					}
				}
			} catch (Exception e) {
				// TODO: handle exception
				System.err.println(e.getMessage());
			}
			
		}
		*/
	}
	
	public HistoclinAiepiResultado construirHistoclinAiepiResultado(
			String ciaopr, Integer hisclicod, Integer nropersona, Integer campoaiepirespucod, Integer riesgocod, Integer campoaiepicod
			){

		HistoclinAiepiResultado objHistoclinAiepiResultado = new HistoclinAiepiResultado();
		objHistoclinAiepiResultado.getId().setCiaopr(ciaopr);
		objHistoclinAiepiResultado.getId().setHisclicod(hisclicod);
		objHistoclinAiepiResultado.setNropersona(nropersona);
		objHistoclinAiepiResultado.setCampoaiepirespucod(campoaiepirespucod);
		objHistoclinAiepiResultado.setRiesgocod(riesgocod);
		objHistoclinAiepiResultado.setCampoaiepicod(campoaiepicod);
		
		return objHistoclinAiepiResultado;
	}

	public void eliminarHistoclinAiepiResultadoPorEventoExtern(String ciaopr, Integer hisclicod, Integer procedimcod){
		HistoclinAiepiResultado objHistoclinAiepiResultado = null;
		try {
			objHistoclinAiepiResultado = buscarHistoclinAiepiResultado(ciaopr, hisclicod, procedimcod );
			this.eliminar(objHistoclinAiepiResultado, true);
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("e.eliminarProcedimientoPorEventosExterna:: " + e.getMessage());
		}
	}
	

	public void eliminarHistoclinAiepiResultadoGrpCodigos_PorEventoExterno(String ciaopr, Integer nropersona, Integer hisclicod, String campoaiepirespucod, Session s){
		String query = "";
		Session sesion = null;
		Transaction t = null;
		query = "delete from histoclin_aiepi_resultado  " +
				"where ciaopr = '" + ciaopr + "' and " +
					"hisclicod = " + hisclicod + " and " +
					"nropersona = " + nropersona + " and " +
					"campoaiepirespucod NOT IN ( " + campoaiepirespucod + ")";	
		System.out.println("ServicioHistoclinAiepiResultado.eliminarHistoclinAiepiResultadoGrpCodigos_PorEventoExterno");
		System.out.println("query: " + query);
		/*
		try {
			if(s!=null){
				sesion = s;
			}else{
				sesion = propiedadDAO.getSessionFactory().openSession();
				t = sesion.beginTransaction();
			}
			sesion.createSQLQuery(query).executeUpdate();
			
			if(s==null){
				t.commit();
				sesion.close();
				t = null;
				sesion = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			e.printStackTrace();
			try{
				t.rollback();
			}catch (Exception e1) {
				sesion = null;
				t=null;
			}
		}
		*/
		
		try {
			super.ejecutarQueryDMLk(query, null);
			//propiedadDAO.ejecutarConsultaSQL(sqlQuery, sesion);
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("e.eliminarHistoclinAiepiResultadoGrpCodigos_PorEventoExterno-> " + e.getMessage());
		}		
	}
	
/*
	public void eliminarHistoclinAiepiResultado_PorEventoExterno(String ciaopr, Integer nropersona, Integer hisclicod, String campoaiepirespucod,Session s){
		Session sesion = null;
		org.hibernate.Transaction t = null;
		String query = "";

		query = "delete from histoclin_aiepi_resultado  " +
				"where ciaopr = '" + ciaopr + "' and " +
					"hisclicod = " + hisclicod + " and " +
					"nropersona = " + nropersona + " and " +
					"campoaiepirespucod NOT IN ( " + campoaiepirespucod + ")";	
		
		System.out.println("query: " + query);
		
		try {
			if(s!=null){
				sesion = s;
			}else{
				sesion = propiedadDAO.getSessionFactory().openSession();
				t = sesion.beginTransaction();
 			}
			sesion.createSQLQuery(query).executeUpdate();
			
			if(s==null){
				t.commit();
				sesion.close();
				t = null;
				sesion = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			e.printStackTrace();
			try{
				t.rollback();
			}catch (Exception e1) {
				sesion = null;
				t=null;
			}
		}

		
	}
*/	
	public HistoclinAiepiResultado buscarHistoclinAiepiResultado(String ciaopr, Integer hisclicod, Integer campoaiepirespucod){
		HistoclinAiepiResultado objHistoclinAiepiResultado = null;
		String query = "";
		try {
			query = "FROM HistoclinAiepiResultado tabla WHERE tabla.id.ciaopr='" + ciaopr + "'" +
			" and tabla.id.hisclicod = " + hisclicod +
			" and tabla.campoaiepirespucod = " + campoaiepirespucod;
			
			List histoclinAiepiResultado = propiedadDAO.ejecutarQueryConsulta(query);
			objHistoclinAiepiResultado = (HistoclinAiepiResultado)histoclinAiepiResultado.get(0);
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("ServicioHistoclinAiepiResultado.buscarHistoclinAiepiResultado.servicioHistoclinDiagnosticos.buscarDiagnosticoOrden:: " + e.getMessage());
		}
		
		return objHistoclinAiepiResultado;
	}
	
	public ServicioCorrelativosAiepis getServicioCorrelativosAiepis() {
		return servicioCorrelativosAiepis;
	}

	public void setServicioCorrelativosAiepis(
			ServicioCorrelativosAiepis servicioCorrelativosAiepis) {
		this.servicioCorrelativosAiepis = servicioCorrelativosAiepis;
	}



	public ServicioTablaApoyoAiepisDiagnosticos getServicioTablaApoyoAiepisDiagnosticos() {
		return servicioTablaApoyoAiepisDiagnosticos;
	}



	public void setServicioTablaApoyoAiepisDiagnosticos(
			ServicioTablaApoyoAiepisDiagnosticos servicioTablaApoyoAiepisDiagnosticos) {
		this.servicioTablaApoyoAiepisDiagnosticos = servicioTablaApoyoAiepisDiagnosticos;
	}


}
